﻿using System;
using System.Collections.Generic;
using System.Linq;
using Kaesoft.Hospedaje.Data;
using Kaesoft.Hospedaje.Entities;
using Microsoft.Practices.EnterpriseLibrary.ExceptionHandling;

namespace Kaesoft.Hospedaje.Business
{
    public partial class ReservacionBusiness
    {
        #region Metodos Publicos
        #region ObtenerServicios
        /// <summary>
        /// obtiene la lista de servicios
        /// </summary>
        /// <returns>la lista consultada</returns>
        public List<Servicio> ObtenerServicios()
        {
            List<Servicio> lista = null;
            try
            {
                using (var contexto = new ReservacionesEntities())
                {
                    lista = (from servicios in contexto.Servicios
                             where !servicios.borrado && servicios.estado == 1
                             select servicios).ToList();
                }

            }
            catch (Exception ex)
            {
                if (ExceptionPolicy.HandleException(ex, Constants.ExceptionPolicyDataAccess)) { throw; };
            }
            return lista;
        }
        #endregion
        
        #region ObtenerHabitaciones
        /// <summary>
        /// Metodo para obtener todas las habitaciones en estado activo
        /// </summary>
        /// <returns></returns>
        public List<Habitacion> ObtenerHabitaciones()
        {
            List<Habitacion> lista = null;
            try
            {
                using (var contexto = new ReservacionesEntities())
                {
                    lista = (from habitaciones in contexto.Habitacions
                             where !habitaciones.borrado
                                   && habitaciones.estado == 1
                             select habitaciones).ToList();
                }

            }
            catch (Exception ex)
            {
                if (ExceptionPolicy.HandleException(ex, Constants.ExceptionPolicyDataAccess)) { throw; };
            }
            return lista;
        }
        #endregion

        #region ObtenerHabitacionesPaginado
        /// <summary>
        /// Metodo para obtener todas las habitaciones en estado activo de una forma paginada
        /// </summary>
        /// <returns></returns>
        public PaginatedList<Habitacion> ObtenerHabitacionesPaginado(int tipoConsulta, string criterio, int indice)
        {
            int total = 0;
            List<Habitacion> lista = null;
            try
            {
                var codigoEntero = tipoConsulta == (int) EnumBuscarCatalogo.Codigo ? int.Parse(criterio) : 0;
                using (ReservacionesEntities ctx = new ReservacionesEntities())
                {
                    total = (from habitaciones in ctx.Habitacions
                             where !habitaciones.borrado
                                   && habitaciones.estado == 1
                                   && ((habitaciones.nombre.Contains(criterio) && tipoConsulta == (int)EnumBuscarCatalogo.Nombre)
                                   || (habitaciones.idHabitacion == codigoEntero && tipoConsulta == (int)EnumBuscarCatalogo.Codigo))
                             select habitaciones).Count();

                    lista = (from habitaciones in ctx.Habitacions
                             where !habitaciones.borrado
                                   && habitaciones.estado == 1
                                   && ((habitaciones.nombre.Contains(criterio) && tipoConsulta == (int)EnumBuscarCatalogo.Nombre)
                                   || (habitaciones.idHabitacion == codigoEntero && tipoConsulta == (int)EnumBuscarCatalogo.Codigo))
                             select habitaciones).ToList().OrderBy(a => a.nombre).Skip(EntidadesUtil.PageSize * (indice)).Take(EntidadesUtil.PageSize).ToList();
                }
            }
            catch (Exception ex)
            {
                if (ExceptionPolicy.HandleException(ex, Constants.ExceptionPolicyDataAccess)) { throw; };
            }

            return new PaginatedList<Habitacion>(lista, total);
        }
        #endregion

        #region ObtenerHabitacion
        /// <summary>
        /// Metodo para obtener una habitacion especifica en estado activo
        /// </summary>
        /// <param name="idHabitacion"></param>
        /// <returns></returns>
        public List<Habitacion> ObtenerHabitacion(int idHabitacion)
        {
            List<Habitacion> lista = null;
            try
            {
                using (var contexto = new ReservacionesEntities())
                {
                    lista = (from habitaciones in contexto.Habitacions
                             where !habitaciones.borrado
                                   && habitaciones.estado == 1
                                   && habitaciones.idHabitacion == idHabitacion
                             select habitaciones).ToList();
                }

            }
            catch (Exception ex)
            {
                if (ExceptionPolicy.HandleException(ex, Constants.ExceptionPolicyDataAccess)) { throw; };
            }
            return lista;
        }
        #endregion

        #region ObtenerHabitacion
        /// <summary>
        /// Metodo para guardar una entidad de tipo habitacion
        /// </summary>
        /// <param name="habitacion"></param>
        /// <returns></returns>
        public void GuardarHabitacion(Habitacion habitacion)
        {
            Guid transactionToken = Guid.Empty;

            try
            {
                transactionToken = TransactionHelper.CreateTransaction();

                using (var contexto = new ReservacionesEntities())
                {
                    EntidadesUtil.SetCamposAuditoria(contexto, habitacion, ServerCache.ObtenerDatosAuditoria(),true, false);
                    contexto.Habitacions.ApplyChanges(habitacion);
                    contexto.SaveChanges();
                    TransactionHelper.CommitTransaction(ref transactionToken);
                }
            }
            catch (Exception ex)
            {
                if (ExceptionPolicy.HandleException(ex, Constants.ExceptionPolicyDataAccess)) { throw; };
            }
            finally
            {
                // si existe aun la transaccion, rollback
                if (Guid.Empty != transactionToken)
                {
                    TransactionHelper.RollbackTransaction(transactionToken);
                }
            }
        }
        #endregion


        #endregion
    }
}
